#include <myhead.h>
#include "page.h"

static int download_start(char* server,char* local){
	pkg_t* retPkg=pkg_create();
	char sendBuf[256]={0};
	char errmsg[1024]={0};
	int len=pkg_pack_buf(sendBuf, MSG_TYPE_DOWNLOAD_START, 2, (char*)client_loginname(), server);
	int ret=client_sendAndRet(sendBuf, len, retPkg, errmsg);              
	if(ret == 0 && strcmp("OK", pkg_get(retPkg, 0))==0){
		//本地创建文件
		FILE* fp=fopen(local, "w");
		if(fp == NULL){
			perror("本地文件创建失败");
			fclose(fp);
			return -1;
		}
		fclose(fp);
		pkg_free(retPkg);
		return 0;
	}
	print_red("文件下载 开始帧 发送失败");
	pkg_free(retPkg);
	return -1;
}

static int download_content(char* server, char* local){
	long total=0;//计数：已经下载的文件大小
	char buf[2048]={0};
	char errmsg[1024]={0};
	int i=0;
	while(1){
		//打包
		pkg_t* retPkg=pkg_create();
		char sendBuf[256]={0};
		//下载文件的开始位置
		char buf2[30]={0};
		sprintf(buf2,"%ld",total);

		int len=pkg_pack_buf(sendBuf, MSG_TYPE_DOWNLOAD_CONTENT, 3,(char*)client_loginname(), server, buf2);
		//发送
		int ret=client_sendAndRet(sendBuf, len, retPkg, errmsg);              
		//
		i++;
		if(ret != 0 || strcmp("OK", pkg_get(retPkg, 0)) != 0){
			print_red("文件下载失败");
			pkg_free(retPkg);
			return -1;
		}
		int contlen=0;
		char* contbuf=pkg_getbuf(retPkg, 1, &contlen);
		if(contlen == 0){//已经下载完成
			print_green("文件下载完成");
			pkg_free(retPkg);
			return 0;
		}
		//追加写入到本地
		FILE* fp=fopen(local, "a");
		fwrite(contbuf, 1, contlen, fp);
		fclose(fp);
		//下载计数
		total+=contlen;
		pkg_free(retPkg);
	}
	return 0;
}

static int download_end(char* server, char* local){
	return 0;
}


void* page_to_myssh_download(){
	//暂时关闭心跳
	client_stop_heart();
	print_nav2("首页/服务器远程控制功能/下载文件", (char*)client_loginname());
	printf("[输入服务端要下载的文件名]:");
	char server[128]={0};
	fgets(server, sizeof(server), stdin);
	server[strlen(server)-1]=0;
	printf("[输入本地要存储的文件名]:");
	char local[128]={0};
	fgets(local, sizeof(local), stdin);
	local[strlen(local)-1]=0;

	printf("客户端，server=[%s],local=[%s]\n", server, local);

	//1、发送上传文件开始指令(文件名称，文件大小, 当前用户名)
	//打开文件，获取文件大小
	if(download_start(server,local)!=0 
			|| download_content(server, local)!= 0 
			|| download_end(server, local)!=0){
		print_red("文件下载失败");
		return page_to_myssh_index;
	}
	print_green("文件下载完成");
	return page_to_myssh_index;
}

